package net;

public class LiLun {
    /*
        网络编程
            什么事Socket编程
                java.net.Socket是java提供的用于进行网络编程的API。
                Socket编程可以让软件与软件之间以计算机作为载体，以网络作为信息流动的通道进行原酸数据传递，达到交流的目的。
            什么是计算机网络
                计算机网络是指将具有独立功能的多态计算机通过通信线路连接起来实现数据共享和交流的计算机系统‘

            传输文本
                客户端发送文本数据
                    利用IO知识中的留链接，使用客户端的Socket获取输出流进行留链接，利用PrintWriter来实现发送一行字符串的操作。
                服务端读取文本数据
                    在服务端使用对应的Socket获取输入流进行留链接，利用BufferedReader来实现读取一行字符串的操作。
                客户端实现聊天功能
                    按照简易记事本工具的逻辑，实现客户端在控制台输入并发送信息给服务。
                    服务端使用缓冲字符输入流循环读取客户端发送过来的每一行字符串。
     */

    /*
        三次握手与四次挥手
            什么是三次握手与四次挥手
                异常出现的原因：
                    TCP协议是面向连接的可靠传输协议，双方建立连接及断开需要双向确认后才可进行
                    当任意一方再没有进行确认断开操作就擅自结束，另一方就会出现该异常。
                三次握手与四次挥手
                    客户端与服务端建立TCP连接时需要进行三次握手，以确保双方建立可靠连接。
                    任意一方需要断开TCP连接时需要进行四次挥手，以确保双方可靠断开。

            三次握手（Three-way Handshake）
                Socket构造器
                    Socket(String host,int port)：与远端计算机建立TCP连接时会进行3次握手
                第一次握手（SYN）：
                    1.客户端发送一个带有SYN（同步）标志的数据包到服务器，并制定客户端的初始化序列号（ISN）。
                    2.客户端进入SYN_SENT状态，等待服务器的确认。
                第二次握手（SYN-ACK）:
                    1.服务器收到客户端的SYN数据包后，会发送一个带有SYN和ACK（确认）标志的数据报道客户端，确认客户端的请求，并制定服
                    务器的初始化序列号（ISN）。
                    2.服务器进入SYN_RC VD状态。
                第三次握手（ACK）：
                    1.客户端收到服务器的SYN-ACK数据包后，会发送一个带有ACK标志的数据报给服务器，表示确认连接请求。
                    2.服务器收到客户端的ACK后，双方都进入ESTABLISHED状态，建立可靠的连接。
            四次挥手（Four-way Handshake）
                1.客户端发送FIN报文：
                    客户端首先向服务器发送一个带有FIN标志位的报文吗，表示客户端不在发送数据，并请求关闭连接，此时客户端进入“FIN_WAIT_1”状态。
                2.服务器发送ACK报文：
                    服务器收到客户端的FIN报文后，会发送一个确认报文，即ACK报文，告知客户端已经收到关闭请求。此时服务器进入“CLOSE_WAIT”状态，
                    等待确认关闭。
                3.服务器发送FIN报文：
                    服务器在发送ACK报文后，会继续检查是否还有剩余的数据需要发送。如果有，服务器会继续发送数据；如果没有，服务器会发送一个带有
                    FIN标志位的报文给客户端，表示服务器也不再发送数据了。此时服务器进入“LAST_ACK”状态。
                4.客户端发送ACK报文：
                    客户端收到服务器的FIN报文后，会发送一个确认报文，即ACK报文，告知服务器已经收到关闭请求，并进入“TIME_WAIT”状态。
                    在“TIME_WAIT”状态下，客户端等待一段时间（通常为2倍的最大报文段生存时间，即MSL），以确保服务器已经收到ACK报文。
                5.服务器收到ACK报文：
                    服务器收到客户端的ACK报文后，确认客户端已经收到了服务器的关闭请求，此时服务器进入“CLOSED”状态，连接关闭完成。而
                    客户端在等待一段时间后，也会进入“CLOSED”状态，完成连接的关闭。

                在Client的start方法异常处理机制最后添加finally，补充close()操作。
     */

    /*
        多客户端支持
            如何接受多客户端
                ServerSocket提供方法：
                    Socket accept()：用于监听服务端口，一旦一个客户端连接即返回一个Socket。
                    多次调用该方法可以感知多个客户端的连接。

                在Server端的start方法中循环调用accept()
     */

    /*
        多客户端处理问题
            服务端无法实现同时接受多客户端的连接并读取发送过来的消息
            原因：
                出现了循环套循环。
                外层循环执行一次accept方法。
                内存循环就会一致读取该客户端发送的消息，导致无法再次循环调用accept。
     */


}












